import java.util.*;

public class bsm{

    /**
     * 将字符串的两个字符位置互换
     * @param str 要交换的字符串
     * @param pos1 位置一
     * @param pos2 位置二
     * @return 字符互换后的字符串
     */
    public static String swap(String str, int pos1, int pos2) {
        char[] ch = str.toCharArray();  //转换成字符数组进行交换
        char c = ch[pos1];
        ch[pos1] = ch[pos2];
        ch[pos2] = c;
        return String.valueOf(ch);
    }

    /**
     * 找到状态字符串中’0‘字符的下标
     * @param state
     * @return
     */
    public static int findZero(String state) {
        String str = String.valueOf(state);
        int position;
        for (position = 0; position < 9; position++) {
            if (str.charAt(position) == '0')
                break;
        }
        return position;
    }

    /**
     * 广度优先算法
     * @param start 起始状态
     * @param end 目标状态
     * @return 变换次数
     */
    public static int bfs(String start, String end) {
        Queue<String> q = new LinkedList<>();
        //用字符串来标记变换次数，字符串做下标
        HashMap<String, Integer> d = new HashMap<>();

        // 初始状态入队
        q.offer(start);
        //初始化移动次数
        d.put(start, 0);

        //四个方向（上、右、下、左）
        int[] dx = new int[]{-1, 0, 1, 0};
        int[] dy = new int[]{0, 1, 0, -1};

        while(!q.isEmpty()) {
            String t = q.poll();
            if(t.equals(end)) return d.get(t);
            int distance = d.get(t);
            //findZero是寻找0所在下标的函数
            int k = findZero(t);
            //模拟二维数组
            int x = k / 3, y = k % 3;
            //枚举四个方向
            for(int i = 0; i < 4; i++) {
                int a = x + dx[i], b = y + dy[i];
                if(a >= 0 && a < 3 && b >= 0 && b < 3) {
                    t = swap(t, a*3 + b, k);
//                    System.out.println(t);
                    //只有未枚举过的状态才可以进入队列
                    //所以第一次枚举到最终状态一定是最优解
                    if(d.get(t)==null) {
                        d.put(t, distance+1);
                        q.add(t);
//                        System.out.println(d);
//                        System.out.println(q);
                    }
                    t = swap(t, a*3 + b, k);
                }
            }
        }
        return -1;
    }

    public static void main(String[] args) {
//        Scanner scanner = new Scanner(System.in);
//        String start = scanner.next();
//        String end = scanner.next();
        String start = "283104765";
        String end = "123804765";
        System.out.println(bfs(start, end));
    }
}